package com.example.design.c.chain;

import lombok.Getter;
import lombok.Setter;

/**
 * 责任链模式
 * 流程处理类
 * 定义流程处理的方法
 */
@Setter
@Getter
public abstract class FlowHandler {
    /**
     * 下一步的流程处理逻辑
     */
    protected FlowHandler next;

    /**
     * 逻辑处理之前的操作
     *
     * @param request
     * @param flag    指定的流程节点
     *
     * @return 返回true时为当前节点操作
     */
    protected boolean preHandle(FLowRequest request, int flag) {

        // 判断是否应该当前节点审批
        if (request.getSortNum() != flag) {

            // 不该当前节点审批的直接走下一步
            goNext(request);
            return false;
        }

        return true;
    }

    /**
     * 具体的流程处理逻辑
     *
     * @param request 流程对象
     */
    protected abstract void handle(FLowRequest request);

    /**
     * 进行下一步的逻辑
     *
     * @param request
     */
    protected void goNext(FLowRequest request) {
        request.addNext();
        if (next == null) {
            return;
        }
        next.handle(request);
    }
}
